/**
 * Axios实例配置
 * 包含请求/响应拦截器，统一处理认证和错误
 */

import axios from 'axios'
import { API_BASE_URL, REQUEST_TIMEOUT } from './config'
import { useToast } from 'vue-toastification'

const toast = useToast()

/**
 * 创建axios实例
 */
const apiClient = axios.create({
  baseURL: API_BASE_URL,
  timeout: REQUEST_TIMEOUT,
  headers: {
    'Content-Type': 'application/json',
  },
})

/**
 * 请求拦截器
 * 自动添加Authorization token
 */
apiClient.interceptors.request.use(
  (config) => {
    // 从localStorage获取token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    
    // 如果是FormData，删除Content-Type让浏览器自动设置
    if (config.data instanceof FormData) {
      delete config.headers['Content-Type']
    }
    
    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

/**
 * 响应拦截器
 * 统一处理响应和错误
 */
apiClient.interceptors.response.use(
  (response) => {
    // 直接返回data部分
    return response.data
  },
  (error) => {
    // 处理各种错误情况
    if (error.response) {
      const { status, data } = error.response
      
      switch (status) {
        case 401:
          // 未授权 - 清除token并跳转登录
          localStorage.removeItem('token')
          localStorage.removeItem('user')
          toast.error('登录已过期，请重新登录')
          // 延迟跳转，让用户看到提示
          setTimeout(() => {
            window.location.href = '/'
          }, 1500)
          break
          
        case 403:
          // 无权限
          toast.error(data.message || '无权限访问')
          break
          
        case 404:
          // 资源不存在
          toast.error(data.message || '资源不存在')
          break
          
        case 500:
          // 服务器错误
          toast.error('服务器错误，请稍后重试')
          break
          
        default:
          // 其他错误
          toast.error(data.message || '请求失败，请重试')
      }
      
      return Promise.reject(error.response.data)
    }
    
    // 网络错误
    if (error.message === 'Network Error') {
      toast.error('网络连接失败，请检查网络')
    } else if (error.code === 'ECONNABORTED') {
      toast.error('请求超时，请重试')
    } else {
      toast.error('请求失败，请重试')
    }
    
    return Promise.reject(error)
  }
)

/**
 * 导出axios实例
 */
export default apiClient
